// ==UserScript==
// @name         linuxDo开心版
// @namespace    https://bbs.tampermonkey.net.cn/
// @version      2.2.0
// @description  添加一些勋章图标和头像发光等样式,让自己更开心
// @author       冰冻大西瓜
// @license      GPL-3.0
// @match        https://linux.do/*
// @grant        GM_addStyle
// @run-at       document-end
// ==/UserScript==

// 记录当前楼主ID，避免重复添加样式
let currentMasterID = null
// 缓存用户ID，避免重复查询DOM
let cachedUserID = null

// 获取userID（带错误处理和缓存）
const userID = () => {
  if (cachedUserID) return cachedUserID

  try {
    const element = document.querySelector('#data-google-tag-manager')
    if (!element) {
      console.warn('[LinuxDo开心版] 未找到用户ID元素')
      return null
    }

    const dataLayer = element.getAttribute('data-data-layer')
    if (!dataLayer) {
      console.warn('[LinuxDo开心版] 未找到 data-data-layer 属性')
      return null
    }

    const match = dataLayer.match(/:(\d+)/)
    if (!match || !match[1]) {
      console.warn('[LinuxDo开心版] 无法解析用户ID')
      return null
    }

    cachedUserID = match[1]
    return cachedUserID
  } catch (error) {
    console.error('[LinuxDo开心版] 获取用户ID时出错:', error)
    return null
  }
}

// 获取楼主ID（带错误处理）
const masterID = () => {
  try {
    return document.querySelector('.post-stream .post--topic-owner article')?.getAttribute('data-user-id') || null
  } catch (error) {
    console.error('[LinuxDo开心版] 获取楼主ID时出错:', error)
    return null
  }
}

// 防抖函数
function debounce(func, wait) {
  let timeout
  return function executedFunction(...args) {
    const later = () => {
      clearTimeout(timeout)
      func(...args)
    }
    clearTimeout(timeout)
    timeout = setTimeout(later, wait)
  }
}

// 添加用户样式的函数
function addUserStyles() {
  const userId = userID()
  if (!userId) {
    console.warn('[LinuxDo开心版] 无法获取用户ID，跳过样式添加')
    return
  }

  // 动态添加样式到当前用户的帖子
  GM_addStyle(`
    /* 页面宽度修正为100% */
    body.has-sidebar-page .wrap{
      max-width: 100% !important;
    }
    /* 帖子宽度修正为100% */
    .topic-body{
      width: 100% !important;
    }
    div article[data-user-id="${userId}"] {
      /* 给自身头像添加辉光效果 */
      div.row>div.topic-avatar>.post-avatar::after {
        width: 46px;
        height: 46px;
        position: absolute;
        left: 1px;
        top: 1px;
        content: "";
        display: block;
        border-radius: 50%;
        pointer-events: none;
        box-shadow: 0 0 20px #00aeff;
        animation: pulse 5s ease-in-out infinite;
      }

      /* 渐变色文字勋章 span.user-title */
      .first.username a{
      background: linear-gradient(135deg, #ff00ff 0%, #00ffff 25%, #ffff00 50%, #ff00ff 75%, #00ffff 100%);
      background-size: 400% 400%;
      -webkit-background-clip: text;
      -webkit-text-fill-color: rgba(0,0,0,0);
      background-clip: text;
      will-change: background-position;
      animation: holographic 15s ease-in-out infinite;
      }
    }
  `)
}

// 生成勋章图标HTML的函数
function generateBadgeHTML() {
  return `
    <span class="poster-icon badge-type-gold custom-badge" title="连续 365 天访问">

        <svg class="fa d-icon d-icon-far-eye svg-icon svg-string" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
          <use href="#far-eye"></use>
        </svg>

    </span>
    <span class="poster-icon badge-type-gold custom-badge" title="论坛创立前 1 个月内加入的种子用户！">

        <svg class="fa d-icon d-icon-seedling svg-icon svg-string" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
          <use href="#seedling"></use>
        </svg>

    </span>
    <span class="poster-icon badge-type-gold custom-badge" title="让我们一起来破界吧！">

        <svg class="fa d-icon d-icon-hammer svg-icon svg-string" aria-hidden="true" xmlns="http://www.w3.org/2000/svg">
          <use href="#hammer"></use>
        </svg>

    </span>
  `
}

// 添加勋章图标的函数
function addBadgeIcons() {
  try {
    const userId = userID()
    if (!userId) {
      return // 如果没有获取到用户ID，直接返回
    }

    // 直接查询目标容器
    const posterIconContainers = document.querySelectorAll(`article[data-user-id="${userId}"] .poster-icon-container`)

    posterIconContainers.forEach(container => {
      // 如果还没有添加过勋章
      if (!container.querySelector('.custom-badge')) {
        // 生成并插入勋章图标HTML
        const badgeHTML = generateBadgeHTML()
        container.insertAdjacentHTML('afterbegin', badgeHTML)
      }
    })
  } catch (error) {
    console.error('[LinuxDo开心版] 添加勋章图标时出错:', error)
  }
}

// 检测楼主并应用样式
function checkMasterAndApply() {
  const newMasterID = masterID()
  if (newMasterID && newMasterID !== currentMasterID) {
    currentMasterID = newMasterID
    updateMasterStyles(currentMasterID)
  }
}

// 更新楼主样式
function updateMasterStyles(masterId) {
  // 移除旧的楼主样式
  const oldStyle = document.getElementById('master-styles')
  if (oldStyle) oldStyle.remove()

  // 如果有新的楼主ID，添加新样式
  if (masterId) {
    const style = document.createElement('style')
    style.id = 'master-styles'
    style.textContent = `
      /* 添加楼主标识 */
      div article[data-user-id="${masterId}"] > .post__row > .post__body > .topic-meta-data > .names.trigger-user-card::before{
        content: "楼主";
        font-size: 14px;
        color: #FFFAFA;
        background-color:#F2B235;
        border-radius: 5px;
        padding:2px 5px;
        margin-right: 5px;
      }
    `
    document.head.appendChild(style)
  }
}

// 初始化勋章图标功能
function initBadgeIcons() {
  // 使用防抖优化性能，避免频繁触发
  const debouncedUpdate = debounce(() => {
    addBadgeIcons()
    checkMasterAndApply()
  }, 300)

  // 等待页面加载完成
  const observer = new MutationObserver(debouncedUpdate)

  // 开始观察整个文档的变化
  observer.observe(document.body, {
    childList: true,
    subtree: true,
  })

  // 使用 requestIdleCallback 或 setTimeout 进行初始化
  const executeInit = () => {
    addUserStyles()
    addBadgeIcons()
    checkMasterAndApply()
  }

  // 优先使用 requestIdleCallback，如果不支持则降级到 setTimeout
  if (typeof requestIdleCallback !== 'undefined') {
    requestIdleCallback(executeInit, { timeout: 2000 })
  } else {
    setTimeout(executeInit, 1000)
  }
}

// 页面加载完成后执行添加勋章图标
if (document.readyState === 'loading') {
  document.addEventListener('DOMContentLoaded', initBadgeIcons)
} else {
  initBadgeIcons()
}
